#ifndef MEM_FILE
#define MEM_FILE

/*
 * Модуль для работы с файлом. Принцип работы заимствован в mem_buffer, но имеет ряд отличий: функция чтения из файла и функция, осуществляющая
 * запись с дефрагментацией файла. Последняя работает медленнее, прибегать к использованию только в крайнем случае.
 */


int file_create(size_t file_size, const char *file_name);
/* 
 * Создает файл и резервирует место по него. Работает медленно, т. к. posix_fallocate() заполняет файл нулями. Возможна замена на системый вызов
 * fallocate(), но он работает не со всеми файловыми системами.
 * Функция возвращает 1 в случае успеха, в противном случае возвращает 0 и записывает в errno код ошибки.
 * EACCES - нет прав доступа к указанному файлу.
 * EFBIG - невозможно создать файл указанного размера.
 * EFAULT - прочие ошибки, связанные с файлом.
 */

void file_remove();
/*
 * Удаляет файл.
 */

off_t file_write_without_defragmentation(void *buf, size_t sz);
/*
 * Записывает в файл информацию из buf длиной в sz байт. Если переданный указатель оказался NULL'ом, не записывает ничего. Возвращает адрес
 * элемента в файле (смещение от начала), куда тот был помещен. В случае невозможности записи (фрагментация или нехватка места) возвращает -1.
 */

off_t file_write_with_defragmentation(void *buf, size_t sz);
/*
 * Если вставка с помощью предыдущей функции не удалась, то можно попробывать эту. На то, как она написана, лучше не смотреть. Для самых
 * смелых я написала пару комментариев. Однако скомпилировался и заработал этот ужас с первого раза. Тем страшнее.
 */

void file_read(void* buf, off_t address, size_t sz);
/*
 * Осуществляет чтение из файла в буффер.
 */

void file_delete(off_t address);
/*
 * Удаляет элемент из файла. Для безопасного режима с пойзонингом следует раскомментировать код из этой функции.
 */
 
 #endif